home *** CD-ROM | disk | FTP | other *** search
/ Windows Game Programming for Dummies (2nd Edition) / WinGamProgFD.iso / mac / DirectX SDK / DXSDK / samples / Multimedia / VBSamples / Common / d3dshader.bas < prev    next >
BASIC Source File  |  2001-10-08  |  26KB  |  671 lines

  1. Attribute VB_Name = "D3DShaders"
  2.  
  3. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  4. '
  5. '  Copyright (C) 1999-2001 Microsoft Corporation.  All Rights Reserved.
  6. '
  7. '  File:       D3DShader.bas
  8. '  Content:    Shader constants
  9. '
  10. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  11.  
  12. Option Explicit
  13.  
  14. ' destination/source parameter register type
  15. Global Const D3DSI_COMMENTSIZE_SHIFT = 16
  16. Global Const D3DSI_COMMENTSIZE_MASK = &H7FFF0000
  17.  
  18.  
  19.  
  20. '---------------------------------------------------------------------
  21. ' Vertex Shaders
  22. '
  23. '
  24. 'Vertex Shader Declaration
  25. '
  26. 'The declaration portion of a vertex shader defines the static external
  27. 'interface of the shader.  The information in the declaration includes:
  28. '
  29. '- Assignments of vertex shader input registers to data streams.  These
  30. 'assignments bind a specific vertex register to a single component within a
  31. 'vertex stream.  A vertex stream element is identified by a byte offset
  32. 'within the stream and a type.  The type specifies the arithmetic data type
  33. 'plus the dimensionality (1, 2, 3, or 4 values).  Stream data which is
  34. 'less than 4 values are always expanded out to 4 values with zero or more
  35. '0.F values and one 1.F value.
  36. '
  37. '- Assignment of vertex shader input registers to implicit data from the
  38. 'primitive tessellator.  This controls the loading of vertex data which is
  39. 'not loaded from a stream, but rather is generated during primitive
  40. 'tessellation prior to the vertex shader.
  41. '
  42. '- Loading data into the constant memory at the time a shader is set as the
  43. 'current shader.  Each token specifies values for one or more contiguous 4
  44. 'DWORD constant registers.  This allows the shader to update an arbitrary
  45. 'subset of the constant memory, overwriting the device state (which
  46. 'contains the current values of the constant memory).  Note that these
  47. 'values can be subsequently overwritten (between DrawPrimitive calls)
  48. 'during the time a shader is bound to a device via the
  49. 'SetVertexShaderConstant method.
  50. '
  51. '
  52. 'Declaration arrays are single-dimensional arrays of DWORDs composed of
  53. 'multiple tokens each of which is one or more DWORDs.  The single-DWORD
  54. 'token value 0xFFFFFFFF is a special token used to indicate the end of the
  55. 'declaration array.  The single DWORD token value 0x00000000 is a NOP token
  56. 'with is ignored during the declaration parsing.  Note that 0x00000000 is a
  57. 'valid value for DWORDs following the first DWORD for multiple word tokens.
  58. '
  59. '[31:29] TokenType
  60. '    0x0 - NOP (requires all DWORD bits to be zero)
  61. '    0x1 - stream selector
  62. '    0x2 - stream data definition (map to vertex input memory)
  63. '    0x3 - vertex input memory from tessellator
  64. '    0x4 - constant memory from shader
  65. '    0x5 - extension
  66. '    0x6 - reserved
  67. '    0x7 - end-of-array (requires all DWORD bits to be 1)
  68. '
  69. 'NOP Token (single DWORD token)
  70. '    [31:29] 0x0
  71. '    [28:00] 0x0
  72. '
  73. 'Stream Selector (single DWORD token)
  74. '    [31:29] 0x1
  75. '    [28]    indicates whether this is a tessellator stream
  76. '    [27:04] 0x0
  77. '    [03:00] stream selector (0..15)
  78. '
  79. 'Stream Data Definition (single DWORD token)
  80. '    Vertex Input Register Load
  81. '      [31:29] 0x2
  82. '      [28]    0x0
  83. '      [27:20] 0x0
  84. '      [19:16] type (dimensionality and data type)
  85. '      [15:04] 0x0
  86. '      [03:00] vertex register address (0..15)
  87. '    Data Skip (no register load)
  88. '      [31:29] 0x2
  89. '      [28]    0x1
  90. '      [27:20] 0x0
  91. '      [19:16] count of DWORDS to skip over (0..15)
  92. '      [15:00] 0x0
  93. '    Vertex Input Memory from Tessellator Data (single DWORD token)
  94. '      [31:29] 0x3
  95. '      [28]    indicates whether data is normals or u/v
  96. '      [27:24] 0x0
  97. '      [23:20] vertex register address (0..15)
  98. '      [19:16] type (dimensionality)
  99. '      [15:04] 0x0
  100. '      [03:00] vertex register address (0..15)
  101. '
  102. 'Constant Memory from Shader (multiple DWORD token)
  103. '    [31:29] 0x4
  104. '    [28:25] count of 4*DWORD constants to load (0..15)
  105. '    [24:07] 0x0
  106. '    [06:00] constant memory address (0..95)
  107. '
  108. 'Extension Token (single or multiple DWORD token)
  109. '    [31:29] 0x5
  110. '    [28:24] count of additional DWORDs in token (0..31)
  111. '    [23:00] extension-specific information
  112. '
  113. 'End-of-array token (single DWORD token)
  114. '    [31:29] 0x7
  115. '    [28:00] 0x1fffffff
  116. '
  117. 'The stream selector token must be immediately followed by a contiguous set of stream data definition tokens.  This token sequence fully defines that stream, including the set of elements within the stream, the order in which the elements appear, the type of each element, and the vertex register into which to load an element.
  118. 'Streams are allowed to include data which is not loaded into a vertex register, thus allowing data which is not used for this shader to exist in the vertex stream.  This skipped data is defined only by a count of DWORDs to skip over, since the type information is irrelevant.
  119. 'The token sequence:
  120. 'Stream Select: stream=0
  121. 'Stream Data Definition (Load): type=FLOAT3; register=3
  122. 'Stream Data Definition (Load): type=FLOAT3; register=4
  123. 'Stream Data Definition (Skip): count=2
  124. 'Stream Data Definition (Load): type=FLOAT2; register=7
  125. '
  126. 'defines stream zero to consist of 4 elements, 3 of which are loaded into registers and the fourth skipped over.  Register 3 is loaded with the first three DWORDs in each vertex interpreted as FLOAT data.  Register 4 is loaded with the 4th, 5th, and 6th DWORDs interpreted as FLOAT data.  The next two DWORDs (7th and 8th) are skipped over and not loaded into any vertex input register.   Register 7 is loaded with the 9th and 10th DWORDS interpreted as FLOAT data.
  127. 'Placing of tokens other than NOPs between the Stream Selector and Stream Data Definition tokens is disallowed.'
  128. '
  129. '
  130.  
  131. ' Vertex Shader 1.0 register limits. D3D device must provide at least
  132. ' specified number of registers
  133. '
  134. Global Const D3DVS_INPUTREG_MAX_V1_1 = 16
  135. Global Const D3DVS_TEMPREG_MAX_V1_1 = 12
  136. ' This max required number. Device could have more registers. Check caps.
  137. Global Const D3DVS_CONSTREG_MAX_V1_1 = 96
  138. Global Const D3DVS_TCRDOUTREG_MAX_V1_1 = 8
  139. Global Const D3DVS_ADDRREG_MAX_V1_1 = 1
  140. Global Const D3DVS_ATTROUTREG_MAX_V1_1 = 2
  141. Global Const D3DVS_MAXINSTRUCTIONCOUNT_V1_1 = 128
  142.  
  143. ' Pixel Shader DX8 register limits. D3D device will have at most these
  144. ' specified number of registers
  145. '
  146. Global Const D3DPS_INPUTREG_MAX_DX8 = 8
  147. Global Const D3DPS_TEMPREG_MAX_DX8 = 8
  148. Global Const D3DPS_CONSTREG_MAX_DX8 = 8
  149. Global Const D3DPS_TEXTUREREG_MAX_DX8 = 8
  150.  
  151.  
  152. Enum D3DVSD_TOKENTYPE
  153.     D3DVSD_TOKEN_NOP = 0             ' NOP or extension
  154.     D3DVSD_TOKEN_STREAM = 1          ' stream selector
  155.     D3DVSD_TOKEN_STREAMDATA = 2      ' stream data definition (map to vertex input memory)
  156.     D3DVSD_TOKEN_TESSELLATOR = 3     ' vertex input memory from tessellator
  157.     D3DVSD_TOKEN_constMEM = 4        ' global constant memory from shader
  158.     D3DVSD_TOKEN_EXT = 5             ' extension
  159.     D3DVSD_TOKEN_END = 7             ' end-of-array (requires all DWORD bits to be 1)
  160. End Enum
  161.  
  162.  
  163. '3322 2222 2222 1111 1111 11
  164. '1098 7654 3210 9876 5432 1098 7654 3210
  165.  
  166.  
  167.  
  168. Global Const D3DVSD_TOKENTYPESHIFT = 29
  169. Global Const D3DVSD_TOKENTYPEMASK = &HE0000000 '  (7 << D3DVSD_TOKENTYPESHIFT)
  170.  
  171. Global Const D3DVSD_STREAMNUMBERSHIFT = 0
  172. Global Const D3DVSD_STREAMNUMBERMASK = &HF&  '(0xF << D3DVSD_STREAMNUMBERSHIFT)
  173.  
  174. Global Const D3DVSD_DATALOADTYPESHIFT = 28
  175. Global Const D3DVSD_DATALOADTYPEMASK = &H10000000 '(0x1 << D3DVSD_DATALOADTYPESHIFT)
  176.  
  177. Global Const D3DVSD_DATATYPESHIFT = 16
  178. Global Const D3DVSD_DATATYPEMASK = &HF& * 2 ^ D3DVSD_DATATYPESHIFT '0xF<< D3DVSD_DATATYPESHIFT)
  179.  
  180. Global Const D3DVSD_SKIPCOUNTSHIFT = 16
  181. Global Const D3DVSD_SKIPCOUNTMASK = &HF& * 2 ^ D3DVSD_SKIPCOUNTSHIFT '(0xF << D3DVSD_SKIPCOUNTSHIFT)
  182.  
  183. Global Const D3DVSD_VERTEXREGSHIFT = 0
  184. Global Const D3DVSD_VERTEXREGMASK = &HF& * 2 ^ D3DVSD_VERTEXREGSHIFT '(0xF << D3DVSD_VERTEXREGSHIFT)
  185.  
  186. Global Const D3DVSD_VERTEXREGINSHIFT = 20
  187. Global Const D3DVSD_VERTEXREGINMASK = &HF& * 2 ^ D3DVSD_VERTEXREGINSHIFT '(0xF << D3DVSD_VERTEXREGINSHIFT)
  188.  
  189. Global Const D3DVSD_CONSTCOUNTSHIFT = 25
  190. Global Const D3DVSD_CONSTCOUNTMASK = &HF& * 2 ^ D3DVSD_CONSTCOUNTSHIFT ' (0xF << D3DVSD_global constCOUNTSHIFT)
  191.  
  192. Global Const D3DVSD_CONSTADDRESSSHIFT = 0
  193. Global Const D3DVSD_CONSTADDRESSMASK = &H7F&    '(0x7F << D3DVSDCONSTADDRESSSHIFT)
  194.  
  195. Global Const D3DVSD_CONSTRSSHIFT = 16
  196. Global Const D3DVSD_CONSTRSMASK = &H1FFF0000    '(0x1FFF << D3DVSDCONSTRSSHIFT)
  197.  
  198. Global Const D3DVSD_EXTCOUNTSHIFT = 24
  199. Global Const D3DVSD_EXTCOUNTMASK = &H1F& * 2 ^ D3DVSD_EXTCOUNTSHIFT     '(0x1F << D3DVSD_EXTCOUNTSHIFT)
  200.  
  201. Global Const D3DVSD_EXTINFOSHIFT = 0
  202. Global Const D3DVSD_EXTINFOMASK = &HFFFFFF                '(0xFFFFFF << D3DVSD_EXTINFOSHIFT)
  203.  
  204.  
  205. ' bit declarations for _Type fields
  206. Global Const D3DVSDT_FLOAT1 = 0&        ' 1D float expanded to (value, 0., 0., 1.)
  207. Global Const D3DVSDT_FLOAT2 = 1&        ' 2D float expanded to (value, value, 0., 1.)
  208. Global Const D3DVSDT_FLOAT3 = 2&        ' 3D float expanded to (value, value, value, 1.)
  209. Global Const D3DVSDT_FLOAT4 = 3&        ' 4D float
  210. Global Const D3DVSDT_D3DCOLOR = 4&      ' 4D packed unsigned bytes mapped to 0. to 1. range                                    // Input is in D3DCOLOR format (ARGB) expanded to (R, G, B, A)
  211. Global Const D3DVSDT_UBYTE4 = 5&        ' 4D unsigned byte
  212. Global Const D3DVSDT_SHORT2 = 6&        ' 2D signed short expanded to (value, value, 0., 1.)
  213. Global Const D3DVSDT_SHORT4 = 7&        ' 4D signed short
  214.  
  215. ' assignments of vertex input registers for fixed function vertex shader
  216. '
  217. Global Const D3DVSDE_POSITION = 0&
  218. Global Const D3DVSDE_BLENDWEIGHT = 1&
  219. Global Const D3DVSDE_BLENDINDICES = 2&
  220. Global Const D3DVSDE_NORMAL = 3&
  221. Global Const D3DVSDE_PSIZE = 4&
  222. Global Const D3DVSDE_DIFFUSE = 5&
  223. Global Const D3DVSDE_SPECULAR = 6&
  224. Global Const D3DVSDE_TEXCOORD0 = 7&
  225. Global Const D3DVSDE_TEXCOORD1 = 8&
  226. Global Const D3DVSDE_TEXCOORD2 = 9&
  227. Global Const D3DVSDE_TEXCOORD3 = 10&
  228. Global Const D3DVSDE_TEXCOORD4 = 11&
  229. Global Const D3DVSDE_TEXCOORD5 = 12&
  230. Global Const D3DVSDE_TEXCOORD6 = 13&
  231. Global Const D3DVSDE_TEXCOORD7 = 14&
  232. Global Const D3DVSDE_POSITION2 = 15&
  233. Global Const D3DVSDE_NORMAL2 = 16&
  234.  
  235. ' Maximum supported number of texture coordinate sets
  236. Global Const D3DDP_MAXTEXCOORD = 8
  237.  
  238. '---------------------------------------------------------------------
  239. '
  240. ' Pixel Shader (PS) & Vertex Shader (VS) Instruction Token Definition
  241. '
  242. ' **** Version Token ****
  243. ' [07:00] minor version number
  244. ' [15:08] major version number
  245. ' [31:16]
  246. '    PS 0xFFFF
  247. '    VS 0xFFFE
  248. '
  249. ' **** End Token ****
  250. ' [31:00] 0x0000FFFF
  251. '
  252. ' **** Comment Token ****
  253. ' [15:00] 0xFFFE
  254. ' [30:16] DWORD Length (up to 2^15 DWORDS = 128KB)
  255. ' [31] 0x0
  256. '
  257. ' **** Instruction Token ****
  258. ' [15:00] Opcode (D3DSIO_*)
  259. ' [23:16] Opcode-Specific Controls
  260. ' [30:24] Reserved 0x0
  261. ' [31] 0x0
  262. '
  263. ' **** Destination Parameter Token ****
  264. ' [07:00] Register Number (offset in register file)
  265. ' [15:08] Reserved 0x0
  266. ' [19:16] Write Mask
  267. '   [16] Component 0 (X;Red)
  268. '   [17] Component 1 (Y;Green)
  269. '   [18] Component 2 (Z;Blue)
  270. '   [19] Component 3 (W;Alpha)
  271. ' [23:20]
  272. '   PS Result Modifier (bias;..)
  273. '   VS Reserved 0x0
  274. ' [27:24]
  275. '   PS Result Shift Scale (signed )
  276. '   VS Reserved 0x0
  277. ' [30:28] Register Type
  278. '   [0x0] Temporary Register File
  279. '   [0x1] Reserved
  280. '   [0x2] Reserved
  281. '   [0x3]
  282. '      VS Address Register (reg num must be zero)
  283. '      PS Reserved
  284. '   [0x4]
  285. '      VS Rasterizer Output Register File
  286. '      PS Reserved
  287. '   [0x5]
  288. '      VS Attribute Output Register File
  289. '      PS Reserved
  290. '   [0x6]
  291. '      VS Texture Coordinate Register File
  292. '      PS Reserved
  293. '   [0x7] Reserved
  294. ' [31] 0x1
  295. '
  296. ' **** Source Parameter Token *****
  297. ' [12:00] Register Number (offset in register file)
  298. ' [14:13]
  299. '   VS Relative Address Register Component
  300. '   PS Reserved 0x0
  301. ' [15]
  302. '   VS Relative Address
  303. '   PS Reserved 0x0
  304. ' [23:16] Source Component Swizzle
  305. '   [17:16] Component 0 Swizzle
  306. '   [19:18] Component 1 Swizzle
  307. '   [21:20] Component 2 Swizzle
  308. '   [23:22] Component 3 Swizzle
  309. ' [27:24] Source Modifier
  310. '     [0x0] None
  311. '     [0x1] Negate
  312. '     [0x2] Complement
  313. '     [0x3-0xf] Reserved
  314. ' [30:28] Register Type
  315. '   [0x0] Temporary Register File
  316. '   [0x1] Input Register File
  317. '   [0x2] global constant Register File
  318. '   [0x3-0x7] Reserved
  319. ' [31] 0x1
  320. '
  321.  
  322. '
  323. ' Instruction Token Bit Definitions
  324. '
  325. Global Const D3DSI_OPCODE_MASK = &HFFFF&
  326.  
  327. Enum D3DSHADER_INSTRUCTION_OPCODE_TYPE
  328.  
  329.     D3DSIO_NOP = 0            ' PS/VS
  330.     D3DSIO_MOV = 1                ' PS/VS
  331.     D3DSIO_ADD = 2                ' PS/VS
  332.     D3DSIO_SUB = 3                ' PS
  333.     D3DSIO_MAD = 4                ' PS/VS
  334.     D3DSIO_MUL = 5                ' PS/VS
  335.     D3DSIO_RCP = 6                ' VS
  336.     D3DSIO_RSQ = 7                ' VS
  337.     D3DSIO_DP3 = 8                ' PS/VS
  338.     D3DSIO_DP4 = 9                ' VS
  339.     D3DSIO_MIN = 10                ' VS
  340.     D3DSIO_MAX = 11                ' VS
  341.     D3DSIO_SLT = 12                ' VS
  342.     D3DSIO_SGE = 13                ' VS
  343.     D3DSIO_EXP = 14                ' VS
  344.     D3DSIO_LOG = 15                ' VS
  345.     D3DSIO_LIT = 16                ' VS
  346.     D3DSIO_DST = 17                ' VS
  347.     D3DSIO_LRP = 18                ' PS
  348.     D3DSIO_FRC = 19                ' VS
  349.     D3DSIO_M4x4 = 20               ' VS
  350.     D3DSIO_M4x3 = 21               ' VS
  351.     D3DSIO_M3x4 = 22               ' VS
  352.     D3DSIO_M3x3 = 23               ' VS
  353.     D3DSIO_M3x2 = 24               ' VS
  354.  
  355.     D3DSIO_TEXCOORD = 64           ' PS
  356.     D3DSIO_TEXKILL = 65            ' PS
  357.     D3DSIO_TEX = 66                ' PS
  358.     D3DSIO_TEXBEM = 67             ' PS
  359.     D3DSIO_TEXBEML = 68            ' PS
  360.     D3DSIO_TEXREG2AR = 69          ' PS
  361.     D3DSIO_TEXREG2GB = 70          ' PS
  362.     D3DSIO_TEXM3x2PAD = 71         ' PS
  363.     D3DSIO_TEXM3x2TEX = 72         ' PS
  364.     D3DSIO_TEXM3x3PAD = 73         ' PS
  365.     D3DSIO_TEXM3x3TEX = 74         ' PS
  366.     D3DSIO_TEXM3x3DIFF = 75        ' PS
  367.     D3DSIO_TEXM3x3SPEC = 76        ' PS
  368.     D3DSIO_TEXM3x3VSPEC = 77       ' PS
  369.     D3DSIO_EXPP = 78               ' VS
  370.     D3DSIO_LOGP = 79               ' VS
  371.     D3DSIO_CND = 80                ' PS
  372.     D3DSIO_DEF = 81                ' PS
  373.  
  374.     D3DSIO_COMMENT = &HFFFE&
  375.     D3DSIO_END = &HFFFF&
  376. End Enum
  377.  
  378. '
  379. ' Co-Issue Instruction Modifier - if set then this instruction is to be
  380. ' issued in parallel with the previous instruction(s) for which this bit
  381. ' is not set.
  382. '
  383. Global Const D3DSI_COISSUE = &H40000000
  384.  
  385.  
  386. '
  387. ' Parameter Token Bit Definitions
  388. '
  389. Global Const D3DSP_REGNUM_MASK = &HFFF&
  390.  
  391. ' destination parameter write mask
  392. Global Const D3DSP_WRITEMASK_0 = &H10000           ' Component 0 (X;Red)
  393. Global Const D3DSP_WRITEMASK_1 = &H20000           ' Component 1 (Y;Green)
  394. Global Const D3DSP_WRITEMASK_2 = &H40000           ' Component 2 (Z;Blue)
  395. Global Const D3DSP_WRITEMASK_3 = &H80000           ' Component 3 (W;Alpha)
  396. Global Const D3DSP_WRITEMASK_ALL = &HF0000         ' All Components
  397.  
  398. ' destination parameter modifiers
  399. Global Const D3DSP_DSTMOD_SHIFT = 20
  400. Global Const D3DSP_DSTMOD_MASK = &HF00000
  401.  
  402. Enum D3DSHADER_PARAM_DSTMOD_TYPE
  403.  
  404.     D3DSPDM_NONE = 0 * 2 ^ D3DSP_DSTMOD_SHIFT '0<<D3DSP_DSTMOD_SHIFT, ' nop
  405.     D3DSPDM_SATURATE = 1 * 2 ^ D3DSP_DSTMOD_SHIFT '1<<D3DSP_DSTMOD_SHIFT, 'clamp 0 to 1 range
  406.  
  407. End Enum
  408.  
  409. ' destination parameter
  410. Global Const D3DSP_DSTSHIFT_SHIFT = 24
  411. Global Const D3DSP_DSTSHIFT_MASK = &HF000000
  412.  
  413. ' destination/source parameter register type
  414. Global Const D3DSP_REGTYPE_SHIFT = 28
  415. Global Const D3DSP_REGTYPE_MASK = &H70000000
  416.  
  417. Global Const D3DVSD_STREAMTESSSHIFT = 28
  418. Global Const D3DVSD_STREAMTESSMASK = 2 ^ D3DVSD_STREAMTESSSHIFT '(1 << D3DVSD_STREAMTESSSHIFT)
  419.  
  420. Enum D3DSHADER_PARAM_REGISTER_TYPE
  421.  
  422.     D3DSPR_TEMP = &H0&              '0<<D3DSP_REGTYPE_SHIFT, ' Temporary Register File
  423.     D3DSPR_INPUT = &H20000000       '1<<D3DSP_REGTYPE_SHIFT, ' Input Register File
  424.     D3DSPR_CONST = &H40000000       '2<<D3DSP_REGTYPE_SHIFT, ' global constant Register File
  425.     D3DSPR_ADDR = &H60000000        '3<<D3DSP_REGTYPE_SHIFT, ' Address Register (VS)
  426.     D3DSPR_TEXTURE = &H60000000     '3<<D3DSP_REGTYPE_SHIFT, ' Texture Register File (PS)
  427.     D3DSPR_RASTOUT = &H80000000     '4<<D3DSP_REGTYPE_SHIFT, ' Rasterizer Register File
  428.     D3DSPR_ATTROUT = &HA0000000     '5<<D3DSP_REGTYPE_SHIFT, ' Attribute Output Register File
  429.     D3DSPR_TEXCRDOUT = &HC0000000   '6<<D3DSP_REGTYPE_SHIFT, ' Texture Coordinate Output Register File
  430. End Enum
  431.  
  432. ' Register offsets in the Rasterizer Register File
  433. '
  434. Enum D3DVS_RASTOUT_OFFSETS
  435.     D3DSRO_POSITION = 0
  436.     D3DSRO_FOG = 1
  437.     D3DSRO_POINT_SIZE = 2
  438. End Enum
  439.  
  440. ' Source operand addressing modes
  441.  
  442. Global Const D3DVS_ADDRESSMODE_SHIFT = 13
  443. Global Const D3DVS_ADDRESSMODE_MASK = (2 ^ D3DVS_ADDRESSMODE_SHIFT)
  444.  
  445. Enum D3DVS_ADRRESSMODE_TYPE
  446.     D3DVS_ADDRMODE_ABSOLUTE = 0     '(0 << D3DVS_ADDRESSMODE_SHIFT),
  447.     D3DVS_ADDRMODE_RELATIVE = 2 ^ D3DVS_ADDRESSMODE_SHIFT '(1 << D3DVS_ADDRESSMODE_SHIFT)   ' Relative to register A0
  448. End Enum
  449.  
  450. ' Source operand swizzle definitions
  451. '
  452. Global Const D3DVS_SWIZZLE_SHIFT = 16
  453. Global Const D3DVS_SWIZZLE_MASK = &HFF0000
  454.  
  455. ' The following bits define where to take component X:
  456.  
  457. Global Const D3DVS_X_X = (0 * 2 ^ D3DVS_SWIZZLE_SHIFT)   '(0 << D3DVS_SWIZZLE_SHIFT)
  458. Global Const D3DVS_X_Y = (1 * 2 ^ D3DVS_SWIZZLE_SHIFT)   '(1 << D3DVS_SWIZZLE_SHIFT)
  459. Global Const D3DVS_X_Z = (2 * 2 ^ D3DVS_SWIZZLE_SHIFT)   '(2 << D3DVS_SWIZZLE_SHIFT)
  460. Global Const D3DVS_X_W = (3 * 2 ^ D3DVS_SWIZZLE_SHIFT)   '(3 << D3DVS_SWIZZLE_SHIFT)
  461.  
  462. ' The following bits define where to take component Y:
  463.  
  464. Global Const D3DVS_Y_X = (0 * 2 ^ (D3DVS_SWIZZLE_SHIFT + 2))     '  (0 << (D3DVS_SWIZZLE_SHIFT + 2))
  465. Global Const D3DVS_Y_Y = (1 * 2 ^ (D3DVS_SWIZZLE_SHIFT + 2))      ' (1 << (D3DVS_SWIZZLE_SHIFT + 2))
  466. Global Const D3DVS_Y_Z = (2 * 2 ^ (D3DVS_SWIZZLE_SHIFT + 2))      ' (2 << (D3DVS_SWIZZLE_SHIFT + 2))
  467. Global Const D3DVS_Y_W = (3 * 2 ^ (D3DVS_SWIZZLE_SHIFT + 2))      ' (3 << (D3DVS_SWIZZLE_SHIFT + 2))
  468.  
  469. ' The following bits define where to take component Z:
  470.  
  471. Global Const D3DVS_Z_X = (0 * 2 ^ (D3DVS_SWIZZLE_SHIFT + 4))         '(0 << (D3DVS_SWIZZLE_SHIFT + 4))
  472. Global Const D3DVS_Z_Y = (1 * 2 ^ (D3DVS_SWIZZLE_SHIFT + 4))        '(1 << (D3DVS_SWIZZLE_SHIFT + 4))
  473. Global Const D3DVS_Z_Z = (2 * 2 ^ (D3DVS_SWIZZLE_SHIFT + 4))         '(2 << (D3DVS_SWIZZLE_SHIFT + 4))
  474. Global Const D3DVS_Z_W = (3 * 2 ^ (D3DVS_SWIZZLE_SHIFT + 4))        '(3 << (D3DVS_SWIZZLE_SHIFT + 4))
  475.  
  476. ' The following bits define where to take component W:
  477.  
  478. Global Const D3DVS_W_X = (0 * 2 ^ (D3DVS_SWIZZLE_SHIFT + 6))            '(0 << (D3DVS_SWIZZLE_SHIFT + 6))
  479. Global Const D3DVS_W_Y = (1 * 2 ^ (D3DVS_SWIZZLE_SHIFT + 6))            '(1 << (D3DVS_SWIZZLE_SHIFT + 6))
  480. Global Const D3DVS_W_Z = (2 * 2 ^ (D3DVS_SWIZZLE_SHIFT + 6))            '(2 << (D3DVS_SWIZZLE_SHIFT + 6))
  481. Global Const D3DVS_W_W = (3 * 2 ^ (D3DVS_SWIZZLE_SHIFT + 6))             '(3 << (D3DVS_SWIZZLE_SHIFT + 6))
  482.  
  483. ' Value when there is no swizzle (X is taken from X, Y is taken from Y,
  484. ' Z is taken from Z, W is taken from W
  485. '
  486. Global Const D3DVS_NOSWIZZLE = (D3DVS_X_X Or D3DVS_Y_Y Or D3DVS_Z_Z Or D3DVS_W_W)
  487.  
  488. ' source parameter swizzle
  489. Global Const D3DSP_SWIZZLE_SHIFT = 16
  490. Global Const D3DSP_SWIZZLE_MASK = &HFF0000
  491.  
  492. Global Const D3DSP_NOSWIZZLE = _
  493.     ((0 * 2 ^ (D3DSP_SWIZZLE_SHIFT + 0)) Or _
  494.       (1 * 2 ^ (D3DSP_SWIZZLE_SHIFT + 2)) Or _
  495.       (2 * 2 ^ (D3DSP_SWIZZLE_SHIFT + 4)) Or _
  496.       (3 * 2 ^ (D3DSP_SWIZZLE_SHIFT + 6)))
  497.  
  498. ' pixel-shader swizzle ops
  499. Global Const D3DSP_REPLICATEALPHA = _
  500.     ((3 * 2 ^ (D3DSP_SWIZZLE_SHIFT + 0)) Or _
  501.       (3 * 2 ^ (D3DSP_SWIZZLE_SHIFT + 2)) Or _
  502.       (3 * 2 ^ (D3DSP_SWIZZLE_SHIFT + 4)) Or _
  503.       (3 * 2 ^ (D3DSP_SWIZZLE_SHIFT + 6)))
  504.       
  505.  
  506. ' source parameter modifiers
  507. Global Const D3DSP_SRCMOD_SHIFT = 24
  508. Global Const D3DSP_SRCMOD_MASK = &HF000000
  509.  
  510. Enum D3DSHADER_PARAM_SRCMOD_TYPE
  511.     D3DSPSM_NONE = 0 * 2 ^ D3DSP_SRCMOD_SHIFT    '0<<D3DSP_SRCMOD_SHIFT, ' nop
  512.     D3DSPSM_NEG = 1 * 2 ^ D3DSP_SRCMOD_SHIFT     ' negate
  513.     D3DSPSM_BIAS = 2 * 2 ^ D3DSP_SRCMOD_SHIFT    ' bias
  514.     D3DSPSM_BIASNEG = 3 * 2 ^ D3DSP_SRCMOD_SHIFT ' bias and negate
  515.     D3DSPSM_SIGN = 4 * 2 ^ D3DSP_SRCMOD_SHIFT    ' sign
  516.     D3DSPSM_SIGNNEG = 5 * 2 ^ D3DSP_SRCMOD_SHIFT ' sign and negate
  517.     D3DSPSM_COMP = 6 * 2 ^ D3DSP_SRCMOD_SHIFT    ' complement
  518. End Enum
  519.  
  520.  
  521.  
  522. '''''''''''''''''''''''''''''''''''
  523. 'PIXELSHADER FUNCTIONS
  524. '''''''''''''''''''''''''''''''''''
  525.  
  526.  
  527. ' pixel shader version token
  528. Function D3DPS_VERSION(Major As Long, Minor As Long) As Long
  529.     D3DPS_VERSION = (&HFFFF0000 Or ((Major) * 2 ^ 8) Or (Minor))
  530. End Function
  531.  
  532.  
  533. ' vertex shader version token
  534. Function D3DVS_VERSION(Major As Long, Minor As Long) As Long
  535.     D3DVS_VERSION = (&HFFFE0000 Or ((Major) * 2 ^ 8) Or (Minor))
  536. End Function
  537.  
  538.  
  539. ' extract major/minor from version cap
  540. Function D3DSHADER_VERSION_MAJOR(Version As Long) As Long
  541.     D3DSHADER_VERSION_MAJOR = (((Version) \ 8) And &HFF&)
  542. End Function
  543.     
  544. Function D3DSHADER_VERSION_MINOR(Version As Long) As Long
  545.     D3DSHADER_VERSION_MINOR = (((Version)) And &HFF&)
  546. End Function
  547.     
  548.  
  549. Function D3DSHADER_COMMENT(DWordSize As Long) As Long
  550.     D3DSHADER_COMMENT = ((((DWordSize) * 2 ^ D3DSI_COMMENTSIZE_SHIFT) And D3DSI_COMMENTSIZE_MASK) Or D3DSIO_COMMENT)
  551. End Function
  552.     
  553.  
  554. ' pixel/vertex shader end token
  555. Function D3DPS_END() As Long
  556.     D3DPS_END = &HFFFF&
  557. End Function
  558.  
  559. Function D3DVS_END() As Long
  560.    D3DVS_END = &HFFFF&
  561. End Function
  562.  
  563.  
  564.  
  565.  
  566.  
  567. '''''''''''''''''''''''''''''''''''
  568. 'VERTEXSHADER FUNCTIONS
  569. '''''''''''''''''''''''''''''''''''
  570.  
  571.  
  572. Function D3DVSD_MAKETOKENTYPE(tokenType As Long) As Long
  573.     Dim out As Long
  574.     Select Case tokenType
  575.         Case D3DVSD_TOKEN_NOP    '0
  576.             out = 0
  577.         Case D3DVSD_TOKEN_STREAM '1          ' stream selector
  578.             out = &H20000000
  579.         Case D3DVSD_TOKEN_STREAMDATA     '2      ' stream data definition (map to vertex input memory)
  580.             out = &H40000000
  581.         Case D3DVSD_TOKEN_TESSELLATOR ' 3     ' vertex input memory from tessellator
  582.             out = &H60000000
  583.         Case D3DVSD_TOKEN_constMEM  '4        ' global constant memory from shader
  584.             out = &H80000000
  585.         Case D3DVSD_TOKEN_EXT    '5             ' extension
  586.             out = &HA0000000
  587.         Case D3DVSD_TOKEN_END   '7             ' end-of-array (requires all DWORD bits to be 1)
  588.             out = &HFFFFFFFF
  589.     End Select
  590.     D3DVSD_MAKETOKENTYPE = out And D3DVSD_TOKENTYPEMASK
  591. End Function
  592.  
  593.  
  594. ' macros for generation of CreateVertexShader Declaration token array
  595.  
  596. ' Set current stream
  597. ' _StreamNumber [0..(MaxStreams-1)] stream to get data from
  598. '
  599. Function D3DVSD_STREAM(StreamNumber As Long) As Long
  600.     D3DVSD_STREAM = (D3DVSD_MAKETOKENTYPE(D3DVSD_TOKEN_STREAM) Or (StreamNumber))
  601. End Function
  602.  
  603.  
  604. ' Set tessellator stream
  605. '
  606. Function D3DVSD_STREAM_TESS() As Long
  607.     D3DVSD_STREAM_TESS = (D3DVSD_MAKETOKENTYPE(D3DVSD_TOKEN_STREAM) Or (D3DVSD_STREAMTESSMASK))
  608. End Function
  609.     
  610.  
  611. ' bind single vertex register to vertex element from vertex stream
  612. '
  613. ' VertexRegister [0..15] address of the vertex register
  614. ' dataType [D3DVSDT_*] dimensionality and arithmetic data type
  615. Function D3DVSD_REG(VertexRegister As Long, dataType As Long) As Long
  616.     D3DVSD_REG = (D3DVSD_MAKETOKENTYPE(D3DVSD_TOKEN_STREAMDATA) Or _
  617.      ((dataType) * 2 ^ D3DVSD_DATATYPESHIFT) Or (VertexRegister))
  618. End Function
  619.  
  620. ' Skip DWORDCount DWORDs (vb longs) in vertex
  621. '
  622. Function D3DVSD_SKIP(DWORDCount As Long) As Long
  623.     D3DVSD_SKIP = (D3DVSD_MAKETOKENTYPE(D3DVSD_TOKEN_STREAMDATA) Or &H10000000 Or _
  624.      ((DWORDCount) * 2 ^ D3DVSD_SKIPCOUNTSHIFT))
  625. End Function
  626.     
  627. ' load data into vertex shader global constant memory
  628. '
  629. ' _constantAddress [0..95] - address of global constant array to begin filling data
  630. ' _Count [0..15] - number of global constant vectors to load (4 DWORDs each)
  631. ' followed by 4*_Count DWORDS of data
  632. '
  633. Function D3DVSD_CONST(constantAddress As Long, count As Long) As Long
  634.     D3DVSD_CONST = (D3DVSD_MAKETOKENTYPE(D3DVSD_TOKEN_constMEM) Or _
  635.      ((count) * 2 ^ D3DVSD_CONSTCOUNTSHIFT) Or (constantAddress))
  636. End Function
  637.  
  638. ' enable tessellator generated normals
  639. '
  640. '  VertexRegisterIn  [0..15] address of vertex register whose input stream
  641. '                            will be used in normal computation
  642. '  VertexRegisterOut [0..15] address of vertex register to output the normal to
  643. '
  644. Function D3DVSD_TESSNORMAL(VertexRegisterIn As Long, VertexRegisterOut As Long) As Long
  645.     D3DVSD_TESSNORMAL = (D3DVSD_MAKETOKENTYPE(D3DVSD_TOKEN_TESSELLATOR) Or _
  646.      ((VertexRegisterIn) * 2 ^ D3DVSD_VERTEXREGINSHIFT) Or _
  647.      ((&H2&) * 2 ^ D3DVSD_DATATYPESHIFT) Or (VertexRegisterOut))
  648. End Function
  649.    
  650.  
  651. ' enable tessellator generated surface parameters
  652. '
  653. ' VertexRegister [0..15] address of vertex register to output parameters
  654. '
  655. Function D3DVSD_TESSUV(VertexRegister As Long) As Long
  656.     D3DVSD_TESSUV = (D3DVSD_MAKETOKENTYPE(D3DVSD_TOKEN_TESSELLATOR) Or &H10000000 Or _
  657.      ((&H1&) * 2 ^ D3DVSD_DATATYPESHIFT) Or (VertexRegister))
  658. End Function
  659.  
  660. ' Generates END token
  661. '
  662. Function D3DVSD_END() As Long
  663.         D3DVSD_END = &HFFFFFFFF
  664. End Function
  665.  
  666. Function D3DVSD_NOP() As Long
  667.     D3DVSD_NOP = 0
  668. End Function
  669.  
  670.  
  671.